package com.calefk.util {
	
	public class Collection {
		
		protected var mData:Array;
		
		public function Collection() {
			mData = new Array();
		}
		/**
		 * Retorna el arreglo de datos
		 */
		public function get data():Array {
			return mData;
		}
		/**
		 * Adiciona un nuevo elemento
		 * @param	obj
		 */
		public function add(obj:*):void {
			mData.push(obj);
		}
		/**
		 * Devuelve el tamaño total de datos
		 * @return
		 */
		public function size():int {
			return mData.length;
		}
		/**
		 * Reemplaza los datos por otro
		 * @param	array
		 */
		public function addAll(array:Array):void {
			mData = array;
		}
		/**
		 * Remueve un elemento por su indice
		 * @param	index
		 */
		public function remove(index:int):void {
			mData.splice(index , 1);
		}
		/**
		 * Devuelve el primer elemento del arreglo
		 * @return
		 */
		public function first():* {
			return mData[0];
		}
		/**
		 * Devuelve un elemento por su indice
		 * @param	index
		 * @return  element
		 */
		
		public function getElement(index:int):* {
			return mData[index];
		}
		/**
		 * Devuelve el ultimo elemento del arreglo
		 * @return
		 */
		public function last():* {
			return mData[mData.length - 1];
		}
		/**
		 * Remueve un elemento 
		 * @param	obj
		 */
		public function removeElement(obj:*):void {
			var len:int = mData.length;
			for (var k:int = 0; k < len; k++) {
				if (mData[k] == obj) {
					remove(k);
					break;
				}
			}
		}
		/**
		 * Devuelve una nueva instancia de Iteracion
		 * @return
		 */
		public function iterator():Iterator {
			return new Iterator(mData);
		}
		/**
		 * Remueve todos los elementos
		 */
		public function empty():void {
			mData.splice(0 , mData.length);
		}
		/**
		 * Clona los datos y los devuelve en una collecion
		 * @return
		 */
		public function clone():Collection {
			var l:Collection = new Collection();
			var it:Iterator = iterator();
			while (it.hasNext()) {
				l.add(it.next());
			}
			return l;
		}
	}

}